﻿Imports System.Data
Imports System.Data.Odbc
Imports System.Text
Imports System.Collections.Generic
Imports WSEntidades
Imports Utilerias
Imports WSFactory
Imports MySql.Data.MySqlClient

Public Class ProductoDAL
    Private cadConex As String = ""

    Public Sub New(ByVal pCadConex As String)
        Me.cadConex = pCadConex
    End Sub

#Region "FuncionesUtilizables"

    Public Function existeProducto(ByVal pClave As String) As Boolean
        Dim numReg As Int16 = 0
        Try
            Using myConn As MySqlConnection = New MySqlConnection(Me.cadConex)
                Using myComm As MySqlCommand = myConn.CreateCommand()
                    myComm.CommandText = "SELECT COUNT(*) " & _
                                            "FROM producto " & _
                                            "WHERE Clave = ?Clave;"
                    myComm.Parameters.Clear()
                    myComm.Parameters.AddWithValue("?Clave", pClave)
                    myConn.Open()
                    numReg = Convert.ToInt16(myComm.ExecuteScalar())
                End Using
            End Using
            Return (numReg > 0)
        Catch ex As Exception
            Throw
        Finally
            numReg = Nothing
        End Try
    End Function

    Public Function registraProducto(ByVal pProducto As ProductoBE) As Boolean
            Using myConn As MySqlConnection = New MySqlConnection(Me.cadConex)
                Using myComm As MySqlCommand = myConn.CreateCommand()
                    myComm.CommandText = "INSERT INTO producto(Clave, Tipo, Status, Nombre, Descripcion, Observaciones, " & _
                                                                "IdUnidadDeMedida, DesglosaPrecio, ManoObra, Refacciones, PrecioUnitario, Calculos, " &
                                                                "TipoIVA, TipoBaseIVA, PorcentajeBaseIVA, MontoBaseIVA, AplicaIEPS, IEPSAfectaIVA, " &
                                                                "TasaIEPS, CuotaIEPS, AplicaIVARET, TasaIVARET, AplicaISR, TasaISR, Es, Predial, CodigoBarras) " & _
                                                        "VALUES (@Clave, @Tipo, @Status, @Nombre, @Descripcion, @Observaciones, " & _
                                                                "@IdUnidadDeMedida, @DesglosaPrecio, @ManoObra, @Refacciones, @PrecioUnitario, @Calculos, " &
                                                                "@TipoIVA, @TipoBaseIVA, @PorcentajeBaseIVA, @MontoBaseIVA, @AplicaIEPS, @IEPSAfectaIVA, " &
                                                                "@TasaIEPS, @CuotaIEPS, @AplicaIVARET, @TasaIVARET, @AplicaISR, @TasaISR, @Es, @Predial, @CodigoBarras);"
                    myComm.CommandType = System.Data.CommandType.Text
                    myComm.Parameters.Clear()
                    myComm.Parameters.AddWithValue("@Clave", pProducto.Clave)
                    Select Case pProducto.Tipo
                        Case ProductoBE.TipoProducto.Producto
                            myComm.Parameters.AddWithValue("@Tipo", "P")
                        Case ProductoBE.TipoProducto.Servicio
                            myComm.Parameters.AddWithValue("@Tipo", "S")
                        Case ProductoBE.TipoProducto.Kits
                            myComm.Parameters.AddWithValue("@Tipo", "K")
                    End Select
                    Select Case pProducto.Status
                        Case ProductoBE.StatusProducto.Activo
                            myComm.Parameters.AddWithValue("@Status", "A")
                        Case ProductoBE.StatusProducto.Inactivo
                            myComm.Parameters.AddWithValue("@Status", "I")
                        Case Else
                            myComm.Parameters.AddWithValue("@Status", "A")
                    End Select
                    myComm.Parameters.AddWithValue("@Nombre", pProducto.Nombre)
                    myComm.Parameters.AddWithValue("@Descripcion", pProducto.Descripcion)
                    myComm.Parameters.AddWithValue("@Observaciones", pProducto.Observaciones)
                    myComm.Parameters.AddWithValue("@IdUnidadDeMedida", pProducto.UdeM.IdUdeM)
                    myComm.Parameters.AddWithValue("@DesglosaPrecio", pProducto.DesglosaPrecio)
                    myComm.Parameters.AddWithValue("@ManoObra", pProducto.ManoObra)
                    myComm.Parameters.AddWithValue("@Refacciones", pProducto.Refacciones)
                    myComm.Parameters.AddWithValue("@PrecioUnitario", pProducto.PrecioUnitario)
                    Select Case pProducto.Calculos
                        Case ProductoBE.CalculosProducto.Normal
                            myComm.Parameters.AddWithValue("@Calculos", "N")
                        Case ProductoBE.CalculosProducto.PrecioUnitario
                            myComm.Parameters.AddWithValue("@Calculos", "P")
                        Case ProductoBE.CalculosProducto.Cantidad
                            myComm.Parameters.AddWithValue("@Calculos", "C")
                    End Select
                    Select Case pProducto.TipoIVA
                        Case Enumeraciones.tiposIVA.Normal
                            myComm.Parameters.AddWithValue("@TipoIVA", "N")
                        Case Enumeraciones.tiposIVA.TasaCero
                            myComm.Parameters.AddWithValue("@TipoIVA", "0")
                        Case Enumeraciones.tiposIVA.Exento
                            myComm.Parameters.AddWithValue("@TipoIVA", "E")
                    End Select
                    Select Case pProducto.TipoBaseIVA
                        Case Enumeraciones.tipoBaseParaIVA.Porcentaje
                            myComm.Parameters.AddWithValue("@TipoBaseIVA", "P")
                        Case Enumeraciones.tipoBaseParaIVA.Monto
                            myComm.Parameters.AddWithValue("@TipoBaseIVA", "M")
                    End Select
                    myComm.Parameters.AddWithValue("@PorcentajeBaseIVA", pProducto.PorcentajeBaseIVA)
                    myComm.Parameters.AddWithValue("@MontoBaseIVA", pProducto.MontoBaseIVA)
                    myComm.Parameters.AddWithValue("@AplicaIEPS", pProducto.AplicaIEPS)
                    myComm.Parameters.AddWithValue("@IEPSAfectaIVA", pProducto.IEPSAfectaIVA)
                    myComm.Parameters.AddWithValue("@TasaIEPS", pProducto.TasaIEPS)
                    myComm.Parameters.AddWithValue("@CuotaIEPS", pProducto.CuotaIEPS)
                    myComm.Parameters.AddWithValue("@AplicaIVARET", pProducto.AplicaIVARET)
                    myComm.Parameters.AddWithValue("@TasaIVARET", pProducto.TasaIVARET)
                    myComm.Parameters.AddWithValue("@AplicaISR", pProducto.AplicaISR)
                    myComm.Parameters.AddWithValue("@TasaISR", pProducto.TasaISR)
                Select Case pProducto.Es
                    Case ProductoBE.EsProducto.Ninguno
                        myComm.Parameters.AddWithValue("@Es", "N")
                    Case ProductoBE.EsProducto.Importado
                        myComm.Parameters.AddWithValue("@Es", "A")
                    Case ProductoBE.EsProducto.Inmueble
                        myComm.Parameters.AddWithValue("@Es", "I")
                    Case ProductoBE.EsProducto.IEDU
                        myComm.Parameters.AddWithValue("@Es", "E")
                End Select
                    myComm.Parameters.AddWithValue("@Predial", pProducto.Predial)
                    myComm.Parameters.AddWithValue("@CodigoBarras", pProducto.CodigoBarras)
                    myConn.Open()
                    If (myComm.ExecuteNonQuery() = 1) Then
                        'myComm.CommandText = "SELECT @@identity; "
                        'IdProd = CType(myComm.ExecuteScalar(), Int32)
                        Return True
                    Else
                        Return False
                    End If
                End Using
        End Using

    End Function

    'Public Function registraProductoAdic(ByVal pProductoAdic As ProductoAdicBE, ByVal pClave As String) As Boolean
    '    Using myConn As MySqlConnection = New MySqlConnection(Me.cadConex)
    '        Using myComm As MySqlCommand = myConn.CreateCommand()
    '            myComm.CommandText = "INSERT INTO productoAdic(Clave, IdTipoProducto, TipoInv, StockMax, StockMin, PuntoReorden, " & _
    '                                                            "CostoPromedio, UltimoCosto, IdUnidadMedidaEntrada, FactorConversion, " &
    '                                                            "ManejaLotes, IdUbicacion1, IdUbicacion2, IdUbicacion3, Proveedor1, " &
    '                                                            "Proveedor2) " & _
    '                                    "VALUES (@Clave, @IdTipoProducto, @TipoInv, @StockMax, @StockMin, @PuntoReorden, " & _
    '                                            "@CostoPromedio, @UltimoCosto, @IdUnidadMedidaEntrada, @FactorConversion, " &
    '                                            "@ManejaLotes, @IdUbicacion1, @IdUbicacion2, @IdUbicacion3, @Proveedor1, " &
    '                                            "@Proveedor2);"
    '            myComm.CommandType = System.Data.CommandType.Text
    '            myComm.Parameters.Clear()
    '            myComm.Parameters.AddWithValue("@Clave", pClave)
    '            myComm.Parameters.AddWithValue("@IdTipoProducto", pProductoAdic.TipoProducto.Id)
    '            myComm.Parameters.AddWithValue("@TipoInv", pProductoAdic.TipoInv)
    '            myComm.Parameters.AddWithValue("@StockMax", pProductoAdic.StockMax)
    '            myComm.Parameters.AddWithValue("@StockMin", pProductoAdic.StockMin)
    '            myComm.Parameters.AddWithValue("@PuntoReorden", pProductoAdic.PuntoReorden)
    '            myComm.Parameters.AddWithValue("@CostoPromedio", pProductoAdic.CostoPromedio)
    '            myComm.Parameters.AddWithValue("@UltimoCosto", pProductoAdic.UltimoCosto)
    '            myComm.Parameters.AddWithValue("@IdUnidadMedidaEntrada", pProductoAdic.UnidadEntrada.IdUdeM)
    '            myComm.Parameters.AddWithValue("@FactorConversion", pProductoAdic.FactorConversion)
    '            myComm.Parameters.AddWithValue("@ManejaLotes", pProductoAdic.ManejaLotes)
    '            myComm.Parameters.AddWithValue("@IdUbicacion1", pProductoAdic.Ubicacion1.IdUbicacion)
    '            myComm.Parameters.AddWithValue("@IdUbicacion2", pProductoAdic.Ubicacion2.IdUbicacion)
    '            myComm.Parameters.AddWithValue("@IdUbicacion3", pProductoAdic.Ubicacion3.IdUbicacion)
    '            myComm.Parameters.AddWithValue("@Proveedor1", pProductoAdic.Proveedor1)
    '            myComm.Parameters.AddWithValue("@Proveedor2", pProductoAdic.Proveedor2)
    '            myConn.Open()
    '            If (myComm.ExecuteNonQuery() = 1) Then
    '                Return True
    '            Else
    '                Return False
    '            End If
    '        End Using
    '    End Using
    'End Function

    Public Function existeProductoAdic(ByVal pClave As String) As Boolean
        Try
            Using myConn As MySqlConnection = New MySqlConnection(Me.cadConex)
                Using myComm As MySqlCommand = myConn.CreateCommand()
                    myComm.CommandText = "SELECT COUNT(*) " & _
                                            "FROM productoadic " & _
                                            "WHERE Clave = ?Clave;"
                    myComm.Parameters.Clear()
                    myComm.Parameters.AddWithValue("?Clave", pClave)
                    myConn.Open()
                    Return (Convert.ToInt16(myComm.ExecuteScalar()) > 0)
                End Using
            End Using
        Catch ex As Exception
            Throw
        Finally
        End Try
    End Function

    Public Function actualizaProducto(ByVal pProducto As ProductoBE) As Boolean
        Try
            Using myConn As MySqlConnection = New MySqlConnection(Me.cadConex)
                Using myComm As MySqlCommand = myConn.CreateCommand()
                    myComm.CommandText = "UPDATE producto " & _
                                            "SET Tipo = @Tipo, " &
                                                "Status = @Status, " &
                                                "Nombre = @Nombre, " &
                                                "Descripcion = @Descripcion, " & _
                                                "Observaciones = @Observaciones, " & _
                                                "IdUnidadDeMedida = @IdUnidadDeMedida, " &
                                                "DesglosaPrecio = @DesglosaPrecio, " & _
                                                "ManoObra = @ManoObra, " &
                                                "Refacciones = @Refacciones, " &
                                                "PrecioUnitario = @PrecioUnitario, " & _
                                                "Calculos = @Calculos, " & _
                                                "TipoIVA = @TipoIVA, " &
                                                "TipoBaseIVA = @TipoBaseIVA, " &
                                                "PorcentajeBaseIVA = @PorcentajeBaseIVA, " & _
                                                "MontoBaseIVA = @MontoBaseIVA, " &
                                                "AplicaIEPS = @AplicaIEPS, " &
                                                "IEPSAfectaIVA = @IEPSAfectaIVA, " & _
                                                "TasaIEPS = @TasaIEPS, " &
                                                "CuotaIEPS = @CuotaIEPS, " &
                                                "AplicaIVARET = @AplicaIVARET, " & _
                                                "TasaIVARET = @TasaIVARET, " &
                                                "AplicaISR = @AplicaISR, " &
                                                "TasaISR = @TasaISR, " &
                                                "Es = @Es, " & _
                                                "Predial = @Predial, " &
                                                "CodigoBarras = @CodigoBarras " & _
                                            "WHERE Clave = @Clave; "
                    myComm.CommandType = CommandType.Text
                    myComm.Parameters.Clear()
                    Select Case pProducto.Tipo
                        Case ProductoBE.TipoProducto.Producto
                            myComm.Parameters.AddWithValue("@Tipo", "P")
                        Case ProductoBE.TipoProducto.Servicio
                            myComm.Parameters.AddWithValue("@Tipo", "S")
                        Case ProductoBE.TipoProducto.Kits
                            myComm.Parameters.AddWithValue("@Tipo", "K")
                    End Select
                    Select Case pProducto.Status
                        Case ProductoBE.StatusProducto.Activo
                            myComm.Parameters.AddWithValue("@Status", "A")
                        Case ProductoBE.StatusProducto.Inactivo
                            myComm.Parameters.AddWithValue("@Status", "I")
                        Case Else
                            myComm.Parameters.AddWithValue("@Status", "I")
                    End Select
                    myComm.Parameters.AddWithValue("@Nombre", pProducto.Nombre)
                    myComm.Parameters.AddWithValue("@Descripcion", pProducto.Descripcion)
                    myComm.Parameters.AddWithValue("@Observaciones", pProducto.Observaciones)
                    myComm.Parameters.AddWithValue("@IdUnidadDeMedida", pProducto.UdeM.IdUdeM)
                    myComm.Parameters.AddWithValue("@DesglosaPrecio", pProducto.DesglosaPrecio)
                    myComm.Parameters.AddWithValue("@ManoObra", pProducto.ManoObra)
                    myComm.Parameters.AddWithValue("@Refacciones", pProducto.Refacciones)
                    myComm.Parameters.AddWithValue("@PrecioUnitario", pProducto.PrecioUnitario)
                    Select Case pProducto.Calculos
                        Case ProductoBE.CalculosProducto.Normal
                            myComm.Parameters.AddWithValue("@Calculos", "N")
                        Case ProductoBE.CalculosProducto.Cantidad
                            myComm.Parameters.AddWithValue("@Calculos", "C")
                        Case ProductoBE.CalculosProducto.PrecioUnitario
                            myComm.Parameters.AddWithValue("@Calculos", "P")
                    End Select
                    Select Case pProducto.TipoIVA
                        Case Enumeraciones.tiposIVA.Normal
                            myComm.Parameters.AddWithValue("@TipoIVA", "N")
                        Case Enumeraciones.tiposIVA.TasaCero
                            myComm.Parameters.AddWithValue("@TipoIVA", "0")
                        Case Enumeraciones.tiposIVA.Exento
                            myComm.Parameters.AddWithValue("@TipoIVA", "E")
                    End Select

                    Select Case pProducto.TipoBaseIVA
                        Case Enumeraciones.tipoBaseParaIVA.Porcentaje
                            myComm.Parameters.AddWithValue("@TipoBaseIVA", "P")
                        Case Enumeraciones.tipoBaseParaIVA.Monto
                            myComm.Parameters.AddWithValue("@TipoBaseIVA", "M")
                    End Select

                    myComm.Parameters.AddWithValue("@PorcentajeBaseIVA", pProducto.PorcentajeBaseIVA)
                    myComm.Parameters.AddWithValue("@MontoBaseIVA", pProducto.MontoBaseIVA)
                    myComm.Parameters.AddWithValue("@AplicaIEPS", pProducto.AplicaIEPS)
                    myComm.Parameters.AddWithValue("@IEPSAfectaIVA", pProducto.IEPSAfectaIVA)
                    myComm.Parameters.AddWithValue("@TasaIEPS", pProducto.TasaIEPS)
                    myComm.Parameters.AddWithValue("@CuotaIEPS", pProducto.CuotaIEPS)
                    myComm.Parameters.AddWithValue("@AplicaIVARET", pProducto.AplicaIVARET)
                    myComm.Parameters.AddWithValue("@TasaIVARET", pProducto.TasaIVARET)
                    myComm.Parameters.AddWithValue("@AplicaISR", pProducto.AplicaISR)
                    myComm.Parameters.AddWithValue("@TasaISR", pProducto.TasaISR)
                    Select Case pProducto.Es
                        Case ProductoBE.EsProducto.Ninguno
                            myComm.Parameters.AddWithValue("@Es", "N")
                        Case ProductoBE.EsProducto.Importado
                            myComm.Parameters.AddWithValue("@Es", "A")
                        Case ProductoBE.EsProducto.Inmueble
                            myComm.Parameters.AddWithValue("@Es", "I")
                        Case ProductoBE.EsProducto.IEDU
                            myComm.Parameters.AddWithValue("@Es", "E")
                    End Select
                    myComm.Parameters.AddWithValue("@Predial", pProducto.Predial)
                    myComm.Parameters.AddWithValue("@CodigoBarras", pProducto.CodigoBarras)
                    myComm.Parameters.AddWithValue("@Clave", pProducto.Clave)
                    myConn.Open()
                    If (myComm.ExecuteNonQuery() = 1) Then
                        Return True
                    Else
                        Return False
                    End If
                End Using
            End Using
        Catch ex As Exception
            Throw
        End Try
    End Function

    Public Function registrarOActualizarProductoAdic(ByVal pProductoAdic As ProductoAdicBE, ByVal Clave As String) As Boolean
        Using myConn As MySqlConnection = New MySqlConnection(Me.cadConex)
            Using myComm As MySqlCommand = myConn.CreateCommand()
                myComm.CommandText = "SELECT COUNT(*) " & _
                                        "FROM productoadic " & _
                                        "WHERE Clave = ?Clave;"
                myComm.Parameters.Clear()
                myComm.Parameters.AddWithValue("?Clave", Clave)
                myConn.Open()
                If (Convert.ToInt16(myComm.ExecuteScalar()) = 1) Then
                    'El Registro existe, hay que actualizar
                    'AL ACTUALIZAR NO SE PUEDE ALTERAR EL COSTO PROMEDIO NI EL ULTIMO COSTO, ESTOS VALORES DEPENDEN DE LAS ENTRADAS DE PRODUCTO
                    myComm.CommandText = "UPDATE productoAdic " & _
                                            "SET IdTipoProducto = @IdTipoProducto, " &
                                                "TipoInv = @TipoInv, " &
                                                "StockMax = @StockMax, " &
                                                "StockMin = @StockMin, " & _
                                                "PuntoReorden = @PuntoReorden, " &
                                                "IdUnidadMedidaEntrada = @IdUnidadMedidaEntrada, " &
                                                "FactorConversion = @FactorConversion, " &
                                                "ManejaLotes = @ManejaLotes, " & _
                                                "IdUbicacion1 = @IdUbicacion1, " &
                                                "IdUbicacion2 = @IdUbicacion2, " &
                                                "IdUbicacion3 = @IdUbicacion3, " & _
                                                "Proveedor1 = @Proveedor1, " &
                                                "Proveedor2 = @Proveedor2 " & _
                                                "WHERE Clave = @Clave; "
                    myComm.CommandType = CommandType.Text
                    myComm.Parameters.Clear()
                    If (pProductoAdic.TipoProducto IsNot Nothing) Then
                        myComm.Parameters.AddWithValue("@IdTipoProducto", pProductoAdic.TipoProducto.Id)
                    Else
                        myComm.Parameters.AddWithValue("@IdTipoProducto", DBNull.Value)
                    End If
                    myComm.Parameters.AddWithValue("@TipoInv", DBNull.Value)
                    myComm.Parameters.AddWithValue("@StockMax", pProductoAdic.StockMax)
                    myComm.Parameters.AddWithValue("@StockMin", pProductoAdic.StockMin)
                    myComm.Parameters.AddWithValue("@PuntoReorden", pProductoAdic.PuntoReorden)
                    myComm.Parameters.AddWithValue("@IdUnidadMedidaEntrada", pProductoAdic.UnidadEntrada.IdUdeM)
                    myComm.Parameters.AddWithValue("@FactorConversion", pProductoAdic.FactorConversion)
                    myComm.Parameters.AddWithValue("@ManejaLotes", pProductoAdic.ManejaLotes)
                    If (pProductoAdic.Ubicacion1 Is Nothing) Then
                        myComm.Parameters.AddWithValue("@IdUbicacion1", DBNull.Value)
                    Else
                        myComm.Parameters.AddWithValue("@IdUbicacion1", pProductoAdic.Ubicacion1.IdUbicacion)
                    End If
                    If (pProductoAdic.Ubicacion2 Is Nothing) Then
                        myComm.Parameters.AddWithValue("@IdUbicacion2", DBNull.Value)
                    Else
                        myComm.Parameters.AddWithValue("@IdUbicacion2", pProductoAdic.Ubicacion2.IdUbicacion)
                    End If
                    If (pProductoAdic.Ubicacion3 Is Nothing) Then
                        myComm.Parameters.AddWithValue("@IdUbicacion3", DBNull.Value)
                    Else
                        myComm.Parameters.AddWithValue("@IdUbicacion3", pProductoAdic.Ubicacion3.IdUbicacion)
                    End If
                    If (pProductoAdic.Proveedor1 Is Nothing) Then
                        myComm.Parameters.AddWithValue("@Proveedor1", DBNull.Value)
                    Else
                        myComm.Parameters.AddWithValue("@Proveedor1", pProductoAdic.Proveedor1.CvePro)
                    End If
                    If (pProductoAdic.Proveedor2 Is Nothing) Then
                        myComm.Parameters.AddWithValue("@Proveedor2", DBNull.Value)
                    Else
                        myComm.Parameters.AddWithValue("@Proveedor2", pProductoAdic.Proveedor2.CvePro)
                    End If
                    myComm.Parameters.AddWithValue("@Clave", Clave)
                    If (myComm.ExecuteNonQuery() = 1) Then
                        Return True
                    Else
                        Return False
                    End If
                Else
                    'No existe el registro, hay que insertarlo
                    myComm.CommandText = "INSERT INTO productoAdic(Clave, IdTipoProducto, TipoInv, StockMax, StockMin, PuntoReorden, " & _
                                                            "CostoPromedio, UltimoCosto, IdUnidadMedidaEntrada, FactorConversion, " &
                                                            "ManejaLotes, IdUbicacion1, IdUbicacion2, IdUbicacion3, Proveedor1, " &
                                                            "Proveedor2) " & _
                                    "VALUES (@Clave, @IdTipoProducto, @TipoInv, @StockMax, @StockMin, @PuntoReorden, " & _
                                            "@CostoPromedio, @UltimoCosto, @IdUnidadMedidaEntrada, @FactorConversion, " &
                                            "@ManejaLotes, @IdUbicacion1, @IdUbicacion2, @IdUbicacion3, @Proveedor1, " &
                                            "@Proveedor2);"
                    myComm.CommandType = System.Data.CommandType.Text
                    myComm.Parameters.Clear()
                    myComm.Parameters.AddWithValue("@Clave", Clave)
                    If (pProductoAdic.TipoProducto IsNot Nothing) Then
                        myComm.Parameters.AddWithValue("@IdTipoProducto", pProductoAdic.TipoProducto.Id)
                    Else
                        myComm.Parameters.AddWithValue("@IdTipoProducto", DBNull.Value)
                    End If
                    myComm.Parameters.AddWithValue("@TipoInv", DBNull.Value)
                    myComm.Parameters.AddWithValue("@StockMax", pProductoAdic.StockMax)
                    myComm.Parameters.AddWithValue("@StockMin", pProductoAdic.StockMin)
                    myComm.Parameters.AddWithValue("@PuntoReorden", pProductoAdic.PuntoReorden)
                    myComm.Parameters.AddWithValue("@CostoPromedio", pProductoAdic.CostoPromedio)
                    myComm.Parameters.AddWithValue("@UltimoCosto", pProductoAdic.UltimoCosto)
                    myComm.Parameters.AddWithValue("@IdUnidadMedidaEntrada", pProductoAdic.UnidadEntrada.IdUdeM)
                    myComm.Parameters.AddWithValue("@FactorConversion", pProductoAdic.FactorConversion)
                    myComm.Parameters.AddWithValue("@ManejaLotes", pProductoAdic.ManejaLotes)
                    If (pProductoAdic.Ubicacion1 Is Nothing) Then
                        myComm.Parameters.AddWithValue("@IdUbicacion1", DBNull.Value)
                    Else
                        myComm.Parameters.AddWithValue("@IdUbicacion1", pProductoAdic.Ubicacion1.IdUbicacion)
                    End If
                    If (pProductoAdic.Ubicacion2 Is Nothing) Then
                        myComm.Parameters.AddWithValue("@IdUbicacion2", DBNull.Value)
                    Else
                        myComm.Parameters.AddWithValue("@IdUbicacion2", pProductoAdic.Ubicacion2.IdUbicacion)
                    End If
                    If (pProductoAdic.Ubicacion3 Is Nothing) Then
                        myComm.Parameters.AddWithValue("@IdUbicacion3", DBNull.Value)
                    Else
                        myComm.Parameters.AddWithValue("@IdUbicacion3", pProductoAdic.Ubicacion3.IdUbicacion)
                    End If
                    If (pProductoAdic.Proveedor1 Is Nothing) Then
                        myComm.Parameters.AddWithValue("@Proveedor1", DBNull.Value)
                    Else
                        myComm.Parameters.AddWithValue("@Proveedor1", pProductoAdic.Proveedor1.CvePro)
                    End If
                    If (pProductoAdic.Proveedor2 Is Nothing) Then
                        myComm.Parameters.AddWithValue("@Proveedor2", DBNull.Value)
                    Else
                        myComm.Parameters.AddWithValue("@Proveedor2", pProductoAdic.Proveedor2.CvePro)
                    End If
                    If (myComm.ExecuteNonQuery() = 1) Then
                        Return True
                    Else
                        Return False
                    End If
                End If
            End Using
        End Using
    End Function

    Public Function getProducto(ByVal Clave As String, ByRef pProducAdic As ProductoAdicBE) As ProductoBE
        pProducAdic = Nothing
        Dim tmpProducto As ProductoBE
        Try
            Using myConn As MySqlConnection = New MySqlConnection(Me.cadConex)
                Using myComm As MySqlCommand = myConn.CreateCommand()
                    myComm.CommandText = "SELECT idProducto, Clave, Tipo, producto.Status as StatusProd, Nombre, Descripcion, Observaciones, " & _
                                                "DesglosaPrecio, ManoObra, Refacciones, " &
                                                "PrecioUnitario, Calculos, TipoIVA, TipoBaseIVA, PorcentajeBaseIVA, " & _
                                                "MontoBaseIVA, AplicaIEPS, IEPSAfectaIVA, TasaIEPS, CuotaIEPS, " &
                                                "AplicaIVARET, TasaIVARET, AplicaISR, TasaISR, Es, Predial, CodigoBarras, " & _
                                                "IdUdeM, DesUdeM, udem.Status " & _
                                            "FROM producto INNER JOIN udem ON  IdUnidadDeMedida = IdUdeM " & _
                                            "WHERE Clave = @Clave;"
                    myComm.CommandType = CommandType.Text
                    myComm.Parameters.AddWithValue("@Clave", Clave)
                    myConn.Open()
                    Using myDR As MySqlDataReader = myComm.ExecuteReader()
                        If (myDR.HasRows()) Then
                            myDR.Read()
                            tmpProducto = ProductoFact.Build(myDR)
                        Else
                            tmpProducto = Nothing
                        End If
                    End Using

                    If (tmpProducto Is Nothing) Then
                        pProducAdic = Nothing
                    Else
                        myComm.CommandText = "" &
                            "SELECT" &
                            "    productoadic.Clave as ClaveProdAdic" &
                            "    , tiposproducto.Clave AS ClaveTipoProd" &
                            "    , tiposproducto.Descripcion as DescrTipoProd" &
                            "    , tiposproducto.Estatus" &
                            "    , tiposproducto.IdFamilia" &
                            "    , tiposproducto.IdTipo" &
                            "    , productoadic.TipoInv" &
                            "    , productoadic.StockMax" &
                            "    , productoadic.StockMin" &
                            "    , productoadic.PuntoReorden" &
                            "    , productoadic.CostoPromedio" &
                            "    , productoadic.UltimoCosto" &
                            "    , udem.IdUdeM" &
                            "    , udem.DesUdeM" &
                            "    , udem.Status as EstatusUdeM" &
                            "    , productoadic.FactorConversion" &
                            "    , productoadic.ManejaLotes" &
                            "    , ubicacion_1.IdUbicacion as IdU1" &
                            "    , ubicacion_1.Clave as ClaveU1" &
                            "    , ubicacion_1.Descripcion as DescrU1" &
                            "    , ubicacion_1.Status as EstatusU1" &
                            "    , ubicacion_2.IdUbicacion as IdU2 " &
                            "    , ubicacion_2.Clave as ClaveU2" &
                            "    , ubicacion_2.Descripcion as DescrU2" &
                            "    , ubicacion_2.Status as EstatusU2" &
                            "    , ubicacion_3.IdUbicacion as IdU3" &
                            "    , ubicacion_3.Clave as ClaveU3" &
                            "    , ubicacion_3.Descripcion as DescrU3" &
                            "    , ubicacion_3.Status as EstatusU3" &
                            "	 , productoadic.Proveedor1" &
                            "    , productoadic.Proveedor2" &
                            " FROM" &
                            "    productoadic" &
                            "    LEFT OUTER JOIN tiposproducto " &
                            "        ON (productoadic.IdTipoProducto = tiposproducto.IdTipo)" &
                            "    INNER JOIN udem " &
                            "        ON (productoadic.IdUnidadMedidaEntrada = udem.IdUdeM)" &
                            "    LEFT OUTER JOIN ubicacion AS ubicacion_1" &
                            "        ON (productoadic.IdUbicacion1 = ubicacion_1.IdUbicacion)" &
                            "    LEFT OUTER JOIN ubicacion AS ubicacion_2" &
                            "        ON (productoadic.IdUbicacion2 = ubicacion_2.IdUbicacion)" &
                            "    LEFT OUTER JOIN ubicacion AS ubicacion_3" &
                            "        ON (productoadic.IdUbicacion3 = ubicacion_3.IdUbicacion)" &
                            "    LEFT OUTER JOIN proveedores AS prov1" &
                            "        ON (productoadic.Proveedor1 = prov1.IdPro)" &
                            "    LEFT OUTER JOIN proveedores AS prov2" &
                            "        ON (productoadic.Proveedor2 = prov2.IdPro)" &
                            " WHERE productoadic.Clave = @Clave;"
                        myComm.Parameters.Clear()
                        myComm.Parameters.AddWithValue("@Clave", Clave)
                        Using myDR As MySqlDataReader = myComm.ExecuteReader()
                            If (myDR.HasRows()) Then
                                myDR.Read()
                                pProducAdic = ProductoFact.BuildProductoAdicional(myDR)
                            Else
                                pProducAdic = Nothing
                            End If
                        End Using
                    End If
                End Using
            End Using
            Return tmpProducto
        Finally
            tmpProducto = Nothing
        End Try
    End Function

    Public Function getListadoProducto(ByVal pClave As String, ByVal pNombre As String, ByVal pUdeM As Integer,
                                       ByVal Status As Enumeraciones.estatusParaBusquedas,
                                       ByVal pRegistroInicial As Integer, ByVal pPageSize As Integer,
                                       ByVal pSortColumn As Enumeraciones.campoOrdenamiento, ByVal pSortDirection As Enumeraciones.tipoOrdenamiento,
                                       ByRef pTotalRegistros As Integer) As List(Of ProductoBE)
        pTotalRegistros = 0
        Dim ProductoLs As List(Of ProductoBE) = New List(Of ProductoBE)
        Dim strQueryUnidad As String = ""
        Dim strQryStatus As String = ""

        If (Not String.IsNullOrWhiteSpace(pUdeM)) Then
            If (pUdeM > 0) Then
                strQueryUnidad = " AND IdUnidadDeMedida = @IdUnidadDeMedida "
            End If
        End If
        Select Case Status
            Case Enumeraciones.estatusParaBusquedas.Activos
                strQryStatus = " AND producto.Status = 'A' "
            Case Enumeraciones.estatusParaBusquedas.Inactivos
                strQryStatus = " AND producto.Status = 'I' "
            Case Enumeraciones.estatusParaBusquedas.Todos
                strQryStatus = ""
        End Select

        Try
            Using myConn As MySqlConnection = New MySqlConnection(Me.cadConex)
                Using myComm As MySqlCommand = myConn.CreateCommand()
                    myComm.CommandText = "SELECT SQL_CALC_FOUND_ROWS idProducto, Clave, Tipo, producto.Status as StatusProd, Nombre, Descripcion, Observaciones, " & _
                                                "DesglosaPrecio, ManoObra, Refacciones, " &
                                                "PrecioUnitario, Calculos, TipoIVA, TipoBaseIVA, PorcentajeBaseIVA, " & _
                                                "MontoBaseIVA, AplicaIEPS, IEPSAfectaIVA, TasaIEPS, CuotaIEPS, " &
                                                "AplicaIVARET, TasaIVARET, AplicaISR, TasaISR, Es, Predial, CodigoBarras, " & _
                                                "IdUdeM, DesUdeM, udem.Status " & _
                                            "FROM producto INNER JOIN udem ON  IdUnidadDeMedida = IdUdeM " & _
                                           "WHERE Clave LIKE @Clave " &
                                                    "AND Nombre LIKE @Nombre " &
                                                    strQueryUnidad &
                                                    strQryStatus &
                                           Enumeraciones.getOrderByStatement(Enumeraciones.catalogo.Productos, pSortColumn, pSortDirection) &
                                           " LIMIT @regInic, @pageSize;"
                    myComm.CommandType = CommandType.Text
                    myComm.Parameters.AddWithValue("@Clave", "%" & pClave & "%")
                    myComm.Parameters.AddWithValue("@Nombre", "%" & pNombre & "%")
                    If (strQueryUnidad <> "") Then
                        myComm.Parameters.AddWithValue("@IdUnidadDeMedida", pUdeM)
                    End If
                    myComm.Parameters.AddWithValue("@regInic", pRegistroInicial)
                    myComm.Parameters.AddWithValue("@pageSize", pPageSize)
                    myConn.Open()
                    Using myDR As MySqlDataReader = myComm.ExecuteReader()
                        While myDR.Read()
                            Dim Producto As ProductoBE = ProductoFact.Build(myDR)
                            If (Not Producto Is Nothing) Then
                                ProductoLs.Add(Producto)
                            End If
                            Producto = Nothing
                        End While
                    End Using
                    Using myComm2 As MySqlCommand = myConn.CreateCommand()
                        myComm2.CommandType = CommandType.Text
                        myComm2.CommandText = "SELECT FOUND_ROWS();"
                        pTotalRegistros = Convert.ToInt32(myComm2.ExecuteScalar())
                    End Using
                End Using
            End Using
            Return ProductoLs
        Catch ex As Exception
            Throw
        Finally
            ProductoLs = Nothing
            strQueryUnidad = Nothing
            strQryStatus = Nothing
        End Try
    End Function

    Function cambiaStatus(ByVal Clave As String, ByVal setActivo As Boolean) As Boolean
        Try
            Using myConn As MySqlConnection = New MySqlConnection(Me.cadConex)
                Using myComm As MySqlCommand = myConn.CreateCommand()
                    myComm.CommandText = "UPDATE producto " & _
                                            "SET Status = @Status " & _
                                            "WHERE Clave = @cve;"
                    myComm.CommandType = CommandType.Text
                    myComm.Parameters.Clear()
                    If (setActivo) Then
                        myComm.Parameters.AddWithValue("@Status", "A")
                    Else
                        myComm.Parameters.AddWithValue("@Status", "I")
                    End If
                    myComm.Parameters.AddWithValue("@cve", Clave)
                    myConn.Open()
                    If (myComm.ExecuteNonQuery() = 1) Then
                        Return True
                    Else
                        Return False
                    End If
                End Using
            End Using
        Catch ex As Exception
            Throw
        End Try
    End Function
#End Region



End Class
